Para nuestro trabajo hemos elegido la base de datos pública, que hemos encontrado en el sitio web kaggle.com:
https://www.kaggle.com/uciml/biomechanical-features-of-orthopedic-patients
Esta dataset tiene 2 archivos .csv (column_2C_weka y column_3C_weka), que se puede juntar y valorar conjuntamente: Es una base de datos que contiene informacaión sobre 310 personas, en las que evaluaron posición de vertebras de la columna lumbar utilizando varios parametros (tabla 1) y exolicación visual con la imagen del articulo^1. Dentro de esta muestra habia 100 personas que consideramos “sanos” o “normales” y 210 (“anormales”) que consideramos que tenian algun tipo de patología: “hernia” o “spondilolistesis”.
tabla 1:
| Variable | Expicación del variable |
|---|---|
| pelvic_incidence, numerico | Angulo entre la línea que pasa del centro de la lámina terminal del S1 al centro de las cabezas femorales, y la línea perpendicula a la lámina terminal de S1 |
| pelvic_tilt, numerico | Angulo entre la línea que pasa del centro de la lámina terminal del S1 al centro de las cabezas femorales y una línea vertical |
| lumbar_lordosis_angle, numerico | angulo entre la lámina terminal superior del L1 y S1 |
| sacral_sclope, numerico | angulo entre la línea perpendicula a la lámina terminal de S1 y una línea horizontal |
| pelvic_radius, numerico | Es un angulo entre la línea vertical y una línea del centro de las cabezas femorales hasta el borde posterior de la lámina terminal de S1 |
| degree_spondylolysthesis, numerico | distancia de desplazamiento de la vertebrq superior sobre la vertebra inferior (positivo - anterior y negativo - posterior) |
| class | es posible utilizar este variable como character o factor. |
| class_2c, factor | Classificación de data como “normal” y “anoraml” |
| class_3c, factor | Classificación de data como “normal”, “Hernia” y “spondilolistesis” |
En esta imagen presentaremos la visualización de lo angulos medidas en la base de datos.
Las bibliografía:
Sergides IG, McCombe PF, White G, Mokhtar S, Sears WR. Lumbo-pelvic lordosis and the pelvic radius technique in the assessment of spinal sagittal balance: strengths and caveats. Eur Spine J. 2011;20 Suppl 5(Suppl 5):591-601. doi:10.1007/s00586-011-1926-z
https://www.orthobullets.com/spine/2071/lumbar-spine-anatomy para la fecha de 25.12.2021
# Vamos a introducir los datos en RStudio. Para esto vamos a utilizar la libreria básica del R
column_2C <- read_csv("archive/column_2C_weka.csv",
col_types = cols(pelvic_incidence = col_number(),
`pelvic_tilt numeric` = col_number(),
lumbar_lordosis_angle = col_number(),
sacral_slope = col_number(), pelvic_radius = col_number(),
degree_spondylolisthesis = col_number()))
column_3C <- read_csv("archive/column_3C_weka.csv",
col_types = cols(pelvic_incidence = col_number(),
pelvic_tilt = col_number(), lumbar_lordosis_angle = col_number(),
sacral_slope = col_number(), pelvic_radius = col_number(),
degree_spondylolisthesis = col_number()))
# Vamos a ajustar los nombres de variables y confirmamos que son iguales
colnames(column_2C) <- colnames(column_3C)
colnames(column_2C) %>%
set_names() %>%
map(~(column_2C[,.x]==column_3C[,.x])) %>% as.data.frame() %>% summary() #utilizaremos función map de la libreria purr de tidyverse, aplicando la función a todos los elementos de las columnas correspondientes.
## pelvic_incidence pelvic_tilt lumbar_lordosis_angle sacral_slope
## Mode:logical Mode:logical Mode:logical Mode:logical
## TRUE:310 TRUE:310 TRUE:310 TRUE:310
##
## pelvic_radius degree_spondylolisthesis class
## Mode:logical Mode:logical Mode :logical
## TRUE:310 TRUE:310 FALSE:210
## TRUE :100
# Y cambiamos el nombre de la columna "class" para poder juntar los dos data frame.
column_2C<-rename(column_2C, "class_2" = "class")
column_3C<-rename(column_3C, "class_3" = "class")
# Creamos un data frame con información de los dos archivos iniciales.
ortho_df <- merge(column_2C, column_3C, by = c("pelvic_incidence", "pelvic_tilt", "lumbar_lordosis_angle", "sacral_slope", "pelvic_radius", "degree_spondylolisthesis"))
# Convertimos la varibel class en un factor, con los niveles que van de nivel normal a nivel con alteraciones más faciles de encontrar (no se puede evidenciar la hernía intervertebral en la radiografia, pero la espondilolistesis - sí).
ortho_df <- ortho_df %>% mutate("class_2" = factor(ortho_df$`class_2`, levels = c("Normal", "Abnormal")))
ortho_df <- ortho_df %>% mutate("class_3" = factor(ortho_df$`class_3`, levels = c("Normal", "Hernia", "Spondylolisthesis")))
# En algunas ocasiones, para el objetivo de visualizar la data con mayor facilidad, vamos a cerar un data set con
ortho_df2 <- ortho_df %>% pivot_longer(cols = c(pelvic_incidence, pelvic_tilt, pelvic_radius, sacral_slope, lumbar_lordosis_angle), names_to = "type_of_measure", values_to = "angles") %>% select(type_of_measure, angles, everything())
ortho_df3 <- ortho_df %>% select(where(is.numeric))
De todas las cuestiones que podemos realizar con estos datos, seleccionaremos las dos que, para nosotros, son las más destacables y extrapolables a una utilidad médica real.
La primera cuestión sería relativa a la comparación de grupos. Pregunta 1: ¿Existen diferencias significativas entre las variables angulares del grupo “Normal” respecto al grupo “Abnormal” (personas con hernia o con espondilolistesis)?. En otras palabras, ¿el hecho de tener hernia o espondilolistesis afecta significativamente en alguna de las variables de estudio? Su respuesta nos permitirá discernir qué métodos de medida difieren estadísticamente respecto al grupo “Normal” y llegar a un mejor acercamiento a nivel de diseño de prótesis o clasificación de características de pacientes en bases de datos.
Para resolver esta pregunta compararemos los datos de los grupos a lo largo de este estudio, visualizaremos los estadísticos básicos de nuestra muestra y realizaremos un análisis de varianza (ANOVA) de los grupos (véase los ejercicios 4 y 7).
Pregunta 2: ¿Existe alguna relación o correlación entre las variables del estudio? Esta pregunta nos permitirá conocer la relación entre las variables de estudio para saber si puede existir cierta redundancia en la medida de la anatomía de la columna lumbar. Además, nos permitirá saber si existe un patrón significativo de influencia de una variable determinada a otra/otras variable/s.
Esta cuestión podrá resolverse mediante los estudios de regresión líneal y regresión múltiple (véase los ejercicios 5 y 6). Además, se realizará un análisis de clústering (véase ejercicio 7) para observar si es posible agrupar los datos de nuestra muestra.
El primer elemento de nuestros datos que analizaremos es la estadística básica y el comportamiento de cada variable entre los grupos.
Primeramente observaremos la estadística básica de cada variable mediante el comando “summary()”. Éste nos muestra los valores mínimos, máximos, primer y tercer cuartil, mediana y media para cada variable. Como la desviación estándar de cada variable no sale en el summary por defecto, para calcularla utilizaremos el comando “sd()”. Al ser una variable de tipo caracter, mostramos las observaciones por grupos en las variables “class_2” y “class_3” mediante la herramienta “table()”.
summary(ortho_df)
## pelvic_incidence pelvic_tilt lumbar_lordosis_angle sacral_slope
## Min. : 26.15 Min. :-6.555 Min. : 14.00 Min. : 13.37
## 1st Qu.: 46.43 1st Qu.:10.667 1st Qu.: 37.00 1st Qu.: 33.35
## Median : 58.69 Median :16.358 Median : 49.56 Median : 42.40
## Mean : 60.50 Mean :17.543 Mean : 51.93 Mean : 42.95
## 3rd Qu.: 72.88 3rd Qu.:22.120 3rd Qu.: 63.00 3rd Qu.: 52.70
## Max. :129.83 Max. :49.432 Max. :125.74 Max. :121.43
## pelvic_radius degree_spondylolisthesis class_2
## Min. : 70.08 Min. :-11.058 Normal :100
## 1st Qu.:110.71 1st Qu.: 1.604 Abnormal:210
## Median :118.27 Median : 11.768
## Mean :117.92 Mean : 26.297
## 3rd Qu.:125.47 3rd Qu.: 41.287
## Max. :163.07 Max. :418.543
## class_3
## Normal :100
## Hernia : 60
## Spondylolisthesis:150
##
##
##
table(ortho_df$class_2)
##
## Normal Abnormal
## 100 210
table(ortho_df$class_3)
##
## Normal Hernia Spondylolisthesis
## 100 60 150
sd(ortho_df$pelvic_incidence)
## [1] 17.23652
sd(ortho_df$pelvic_tilt)
## [1] 10.00833
sd(ortho_df$lumbar_lordosis_angle)
## [1] 18.55406
sd(ortho_df$sacral_slope)
## [1] 13.4231
sd(ortho_df$pelvic_radius)
## [1] 13.31738
sd(ortho_df$degree_spondylolisthesis)
## [1] 37.55903
Obsérvese que podemos determinar los límites anotados para cada variable y el comportamiento general mediante la media y la desviación estándar. Estos valores nos servirán más adelante para determinar un intervalo para presentar las variables en gráficos.
La variable “pelvic_incidence” tiene valores de 26.15º hasta 129.83º. Su media es 60.50º con una desviación estándar de 17.23652º.
La variable “pelvic_tilt” tiene valores de -6.555º hasta 49.432º. Su media es de 17.543º con una desviación estándar de 10.00833º.
La variable “lumbar_lordosis_angle” tiene valores de 14º hasta 125.74º. Su media es de 51.93º con una desviación estándar de 18.55406º.
La variable “sacral_slope” tiene valores de 13.37º hasta 121.43º. Su media es de 42.95º con una desviación estándar de 13.4231º.
La variable “pelvic_radius” tiene valores desde 70.08º hasta 163.07º. Su media es de 117.92º con una desviación estándar de 13.31738º.
La variable “degree_spondylolisthesis” tiene valores desde -11.058 mm hasta 418.543 mm. Su media es de 26.297mm con una desviación estándar de 37.55903 mm.
Las variables “class_2 y class_3” incluyen 210 personas en el grupo “Abnormal” (60 con hernia y 150 con espondilolistesis) y 100 personas en el grupo “Normal”.
Aunque esta descripción nos sirve para acotar los valores de las variables con los que trabajamos, los datos comprenden todos grupos de estudio en conjunto.
Nuestro objetivo principal es la comparación entre personas del grupo “Normal” (sin anomalías aparentes relativas a la postura pélvica y lumbar) y “Abnormal” (personas con hernia o espondilolistesis diagnosticada) para determinar si existen diferencias significativas en las variables.
El hecho de dividir los datos podría llegar a mostrar una diferencia en el comportamiento de los mismos. Es por eso que realizaremos un análisis de comparación de variables según los grupos. El valor que compararemos será la media de cada variable, con su desviación estándar anotada. Para ello, dividiremos la media de cada variable según cada grupo (Normal/Abnormal/Hernia/Spondylolisthesis). Asimismo, para hacer un análisis visual, las diferencias entre grupos de estudio se representarán en gráficos de cajas (boxplots). En cada caso se utilizarán los intervalos calculados anteriormente para que la representación de cada gráfico esté en el mismo intervalo y que así su comparación sea más intuitiva y fácil.
Hace falta remarcar que este análisis lo haremos para las variables de tipo angular (las cinco primeras variables). Al tratarse de un trabajo de ámbito educativo, para la variable “grado de espondilolistesis” realizaremos la comparación igualmente, pero de antemano sabemos que será superior en pacientes del grupo “espondilolistesis” respecto al resto, ya que tienen dicha afectación diagnosticada.
Variable 1: Incidencia pélvica (pelvic_incidence)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$pelvic_incidence[ortho_df$class_2=="Normal"])
## [1] 51.68524
sd(ortho_df$pelvic_incidence[ortho_df$class_2=="Normal"])
## [1] 12.36816
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$pelvic_incidence[ortho_df$class_2=="Abnormal"])
## [1] 64.69256
sd(ortho_df$pelvic_incidence[ortho_df$class_2=="Abnormal"])
## [1] 17.66213
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$pelvic_incidence[ortho_df$class_3=="Hernia"])
## [1] 47.63841
sd(ortho_df$pelvic_incidence[ortho_df$class_3=="Hernia"])
## [1] 10.69713
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$pelvic_incidence[ortho_df$class_3=="Spondylolisthesis"])
## [1] 71.51422
sd(ortho_df$pelvic_incidence[ortho_df$class_3=="Spondylolisthesis"])
## [1] 15.10934
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$pelvic_incidence[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="Incidencia pélvica", xlab="Normal", ylim=c(20,130))
boxplot(ortho_df$pelvic_incidence[ortho_df$class_2=="Abnormal"],col="Tomato",main="Incidencia pélvica", xlab="Abnormal",ylim=c(20,130))
boxplot(ortho_df$pelvic_incidence[ortho_df$class_3=="Hernia"],col="coral1",main="Incidencia pélvica", xlab="Hernia", ylim=c(20,130))
boxplot(ortho_df$pelvic_incidence[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="Incidencia pélvica", xlab="Spondylolisthesis", ylim=c(20,130))
par(mfrow=c(1,1))
Observamos que la media del grupo “Normal” es ligeramente inferior a la del grupo “Spondylolisthesis”. Al haber más pacientes en la muestra con “Spondylolisthesis” que en la de “Hernia”, la media del grupo “Abnormal” resulta ser superior a la del grupo “Normal”, con una desviación estándar muy alta. Este hecho se observa en los gráficos, donde parece que el grupo “Spondylolisthesis” supera significativamente la media otorgada por el grupo “Normal”. Como sólo observamos tres outliers aparentes en el grupo de espondilolistesis (la muestra no parece tener mucha distorsión), nuestra primera hipótesis será que los pacientes con espondilolistesis podrían tener una mayor incidencia pélvica general. Así, es probable que la variable “incidencia pélvica” tenga cierto peso a la hora de analizarse en dicho grupo.
Variable 2: Inclinación pélvica (pelvic_tilt)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$pelvic_tilt[ortho_df$class_2=="Normal"])
## [1] 12.82141
sd(ortho_df$pelvic_tilt[ortho_df$class_2=="Normal"])
## [1] 6.778503
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$pelvic_tilt[ortho_df$class_2=="Abnormal"])
## [1] 19.79111
sd(ortho_df$pelvic_tilt[ortho_df$class_2=="Abnormal"])
## [1] 10.51587
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$pelvic_tilt[ortho_df$class_3=="Hernia"])
## [1] 17.39879
sd(ortho_df$pelvic_tilt[ortho_df$class_3=="Hernia"])
## [1] 7.016708
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$pelvic_tilt[ortho_df$class_3=="Spondylolisthesis"])
## [1] 20.74804
sd(ortho_df$pelvic_tilt[ortho_df$class_3=="Spondylolisthesis"])
## [1] 11.50617
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$pelvic_tilt[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="Inclinación pélvica", xlab="Normal", ylim=c(-7,50))
boxplot(ortho_df$pelvic_tilt[ortho_df$class_2=="Abnormal"],col="Tomato",main="Inclinación pélvica", xlab="Abnormal",ylim=c(-7,50))
boxplot(ortho_df$pelvic_tilt[ortho_df$class_3=="Hernia"],col="coral1",main="Inclinación pélvica", xlab="Hernia", ylim=c(-7,50))
boxplot(ortho_df$pelvic_tilt[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="Inclinación pélvica", xlab="Spondylolisthesis", ylim=c(-7,50))
par(mfrow=c(1,1))
Se observa que la media del grupo “Normal” para la inclinación pélvica es ligeramente inferior que la de los otros grupos. No obstante, al existir una desviación estándar realmente alta para todos los grupos en esta variable, es probable que la distinción entre grupos no llegue a ser significativa. Una desviación estándar elevada implica que existe una gran variabilidad en los valores de la muestra para la variable en cuestión. Por lo tanto, no esperamos diferencias significativas entre individuos de los distintos grupos para esta variable.
Variable 3: Ángulo de lordosis lumbar (lumbar_lordosis_angle)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$lumbar_lordosis_angle[ortho_df$class_2=="Normal"])
## [1] 43.5426
sd(ortho_df$lumbar_lordosis_angle[ortho_df$class_2=="Normal"])
## [1] 12.36139
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$lumbar_lordosis_angle[ortho_df$class_2=="Abnormal"])
## [1] 55.92537
sd(ortho_df$lumbar_lordosis_angle[ortho_df$class_2=="Abnormal"])
## [1] 19.66947
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Hernia"])
## [1] 35.46352
sd(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Hernia"])
## [1] 9.767795
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Spondylolisthesis"])
## [1] 64.11011
sd(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Spondylolisthesis"])
## [1] 16.39707
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="Lordosis lumbar", xlab="Normal", ylim=c(13,126))
boxplot(ortho_df$lumbar_lordosis_angle[ortho_df$class_2=="Abnormal"],col="Tomato",main="Lordosis lumbar", xlab="Abnormal",ylim=c(13,126))
boxplot(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Hernia"],col="coral1",main="Lordosis lumbar", xlab="Hernia", ylim=c(13,126))
boxplot(ortho_df$lumbar_lordosis_angle[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="Lordosis lumbar", xlab="Spondylolisthesis", ylim=c(13,126))
par(mfrow=c(1,1))
En este caso observamos que la media del grupo “Normal” es parecida a la del grupo “Hernia”, pero difiere bastante de la del grupo “Spondylolisthesis”. Aunque exista algún outlier apartado que pueda hacer aumentar la desviación estándar de cada grupo (véase los puntos superiores que se distancian de la media en cada gráfico), es probable que esta comparativa pueda ser significativa. Así, nuestra segunda hipótesis es que los pacientes con espondilolistesis podrían tener un mayor ángulo de lordosis lumbar. Y por lo tanto, la variable “ángulo de lordosis lumbar” podría tener más peso en este grupo de pacientes.
Variable 4: Pendiente sacral (sacral_slope)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$sacral_slope[ortho_df$class_2=="Normal"])
## [1] 38.86383
sd(ortho_df$sacral_slope[ortho_df$class_2=="Normal"])
## [1] 9.624004
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$sacral_slope[ortho_df$class_2=="Abnormal"])
## [1] 44.90145
sd(ortho_df$sacral_slope[ortho_df$class_2=="Abnormal"])
## [1] 14.51556
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$sacral_slope[ortho_df$class_3=="Hernia"])
## [1] 30.23961
sd(ortho_df$sacral_slope[ortho_df$class_3=="Hernia"])
## [1] 7.555388
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$sacral_slope[ortho_df$class_3=="Spondylolisthesis"])
## [1] 50.76619
sd(ortho_df$sacral_slope[ortho_df$class_3=="Spondylolisthesis"])
## [1] 12.31881
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$sacral_slope[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="Pendiente sacral", xlab="Normal", ylim=c(12,122))
boxplot(ortho_df$sacral_slope[ortho_df$class_2=="Abnormal"],col="Tomato",main="Pendiente sacral", xlab="Abnormal",ylim=c(12,122))
boxplot(ortho_df$sacral_slope[ortho_df$class_3=="Hernia"],col="coral1",main="Pendiente sacral", xlab="Hernia", ylim=c(12,122))
boxplot(ortho_df$sacral_slope[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="Pendiente sacral", xlab="Spondylolisthesis", ylim=c(12,122))
par(mfrow=c(1,1))
Para la pendiente sacral observamos que las medias de los grupos difieren muy ligeramente, siendo superior en el grupo “Spondylolisthesis”. Existen outliers que pueden alterar la media de los datos, sobretodo en el grupo “Spondylolisthesis”, donde se observan varios puntos que se alejan significativamente del comportamiento del resto de las muestras. Es por eso que probablemente no existan diferencias significativas entre la media de los grupos para esta variable, ya que sin estos outliers la media del grupo “Spondylolisthesis” bajaría y se asemejaría aún más a la de los otros grupos.
Variable 5: Radio pélvico (pelvic_radius)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$pelvic_radius[ortho_df$class_2=="Normal"])
## [1] 123.8908
sd(ortho_df$pelvic_radius[ortho_df$class_2=="Normal"])
## [1] 9.014246
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$pelvic_radius[ortho_df$class_2=="Abnormal"])
## [1] 115.0777
sd(ortho_df$pelvic_radius[ortho_df$class_2=="Abnormal"])
## [1] 14.0906
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$pelvic_radius[ortho_df$class_3=="Hernia"])
## [1] 116.475
sd(ortho_df$pelvic_radius[ortho_df$class_3=="Hernia"])
## [1] 9.35572
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$pelvic_radius[ortho_df$class_3=="Spondylolisthesis"])
## [1] 114.5188
sd(ortho_df$pelvic_radius[ortho_df$class_3=="Spondylolisthesis"])
## [1] 15.57999
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$pelvic_radius[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="Radio pélvico", xlab="Normal", ylim=c(69,164))
boxplot(ortho_df$pelvic_radius[ortho_df$class_2=="Abnormal"],col="Tomato",main="Radio pélvico", xlab="Abnormal",ylim=c(69,164))
boxplot(ortho_df$pelvic_radius[ortho_df$class_3=="Hernia"],col="coral1",main="Radio pélvico", xlab="Hernia", ylim=c(69,164))
boxplot(ortho_df$pelvic_radius[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="Radio pélvico", xlab="Spondylolisthesis", ylim=c(69,164))
par(mfrow=c(1,1))
Las medias de todos los grupos son semejantes, siendo ligeramente inferiores aquellas del grupo abnormal (incluyendo a los grupos hernia y espondilolistesis por separado). La gran variabilidad en el grupo de espondilolistesis (fíjese en su gran desviación estándar) hace dudar de la significación de esta comparación, aunque sea posible que la variable “radio pélvico” sea distintiva en el grupo “Normal” respecto al resto. Aún así, debido a la variabilidad no esperamos que se cumpla esta hipótesis a priori.
Variable 6: Grado de espondilolistesis (degree_spondylolisthesis)
## Media y desviación estándar para el grupo Normal
mean(ortho_df$degree_spondylolisthesis[ortho_df$class_2=="Normal"])
## [1] 2.186572
sd(ortho_df$degree_spondylolisthesis[ortho_df$class_2=="Normal"])
## [1] 6.307483
## Media y desviación estándar para el grupo Abnormal (hernia y espondilolistesis)
mean(ortho_df$degree_spondylolisthesis[ortho_df$class_2=="Abnormal"])
## [1] 37.77771
sd(ortho_df$degree_spondylolisthesis[ortho_df$class_2=="Abnormal"])
## [1] 40.69674
## Media y desviación estándar para el grupo Hernia
mean(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Hernia"])
## [1] 2.480251
sd(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Hernia"])
## [1] 5.531177
## Media y desviación estándar para el grupo Espondilolistesis
mean(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Spondylolisthesis"])
## [1] 51.89669
sd(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Spondylolisthesis"])
## [1] 40.10803
## Gráfico de la variable para cada grupo
par(mfrow=c(1,4))
boxplot(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Normal"],col="darkolivegreen1",main="G.espondilolistesis", xlab="Normal", ylim=c(-12,419))
boxplot(ortho_df$degree_spondylolisthesis[ortho_df$class_2=="Abnormal"],col="Tomato",main="G.espondilolistesis", xlab="Abnormal",ylim=c(-12,419))
boxplot(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Hernia"],col="coral1",main="G.espondilolistesis", xlab="Hernia", ylim=c(-12,419))
boxplot(ortho_df$degree_spondylolisthesis[ortho_df$class_3=="Spondylolisthesis"],col="darkturquoise",main="G.espondilolistesis", xlab="Spondylolisthesis", ylim=c(-12,419))
par(mfrow=c(1,1))
Efectivamente el grado de espondilolistesis en pacientes con espondilolistesis es superior respecto al resto, el cual varía ligeramente de la media 0. Fíjese que esta variable es la única que se mide en milímetros, mostrándonos que la media de variación de la distancia entre vértebras lumbares en pacientes con espondilolistesis es de 51.89669 mm. Por lo tanto, la mayoría de pacientes con espondilolistesis del estudio tienen un grado de espondilolistesis positivo, es decir, la vértebra desplazada tiene un desplazamiento anterior respecto su vértebra inferior en la mayoría de casos.
# Para los valores numericos se puede realizar un scatterplot de interacciones por parejas
ortho_df %>% select(where(is.numeric)) %>% pairs()
# Podemos mirar las interacciones para la classificación de 2 clases
model.matrix(~0. + pelvic_incidence+pelvic_tilt+pelvic_radius+sacral_slope+lumbar_lordosis_angle+ degree_spondylolisthesis + class_2, ortho_df) %>%cor() %>% ggcorrplot(lab=T, lab_size=2.5,type = "lower")
# Podemos mirar las interacciones para la classificación de 3 clases
model.matrix(~0. + pelvic_incidence+pelvic_tilt+pelvic_radius+sacral_slope+lumbar_lordosis_angle+ degree_spondylolisthesis + class_3, ortho_df) %>%cor() %>% ggcorrplot(lab=T, lab_size=2.5,type = "lower")
model_pi <- lm(pelvic_incidence ~ lumbar_lordosis_angle, data = ortho_df)
ortho_df %>% ggplot(aes(lumbar_lordosis_angle, pelvic_incidence)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula 'y ~ x'
### En todos grupos
ortho_df2 %>% group_by(type_of_measure) %>% summarise("Mean of angle" = mean(angles), "Standart deviation" = sd(angles))
## # A tibble: 5 × 3
## type_of_measure `Mean of angle` `Standart deviation`
## <chr> <dbl> <dbl>
## 1 lumbar_lordosis_angle 51.9 18.6
## 2 pelvic_incidence 60.5 17.2
## 3 pelvic_radius 118. 13.3
## 4 pelvic_tilt 17.5 10.0
## 5 sacral_slope 43.0 13.4
ortho_df2 %>% summarise("Mean of displacement" = mean(degree_spondylolisthesis), "SD of displacement" = sd(degree_spondylolisthesis))
## # A tibble: 1 × 2
## `Mean of displacement` `SD of displacement`
## <dbl> <dbl>
## 1 26.3 37.5
ortho_df2 %>% ggplot(aes(y= angles, x = type_of_measure, fill = type_of_measure)) +
geom_boxplot() + stat_summary(fun =mean, shape = 18, size = 1)
## Warning: Removed 5 rows containing missing values (geom_segment).
ortho_df2 %>% ggplot(aes(y= degree_spondylolisthesis, x = 0)) +
geom_boxplot(fill = "red", alpha = 0.4) +
stat_summary(fun = mean, shape = 18, size =1)
## Warning: Removed 1 rows containing missing values (geom_segment).
### En grupos por 2 classificaciones
ortho_df2 %>% group_by(type_of_measure, class_2) %>%
summarise("Mean of angle" = mean(angles), "Standart deviation" = sd(angles))
## `summarise()` has grouped output by 'type_of_measure'. You can override using the `.groups` argument.
## # A tibble: 10 × 4
## # Groups: type_of_measure [5]
## type_of_measure class_2 `Mean of angle` `Standart deviation`
## <chr> <fct> <dbl> <dbl>
## 1 lumbar_lordosis_angle Normal 43.5 12.4
## 2 lumbar_lordosis_angle Abnormal 55.9 19.7
## 3 pelvic_incidence Normal 51.7 12.4
## 4 pelvic_incidence Abnormal 64.7 17.7
## 5 pelvic_radius Normal 124. 9.01
## 6 pelvic_radius Abnormal 115. 14.1
## 7 pelvic_tilt Normal 12.8 6.78
## 8 pelvic_tilt Abnormal 19.8 10.5
## 9 sacral_slope Normal 38.9 9.62
## 10 sacral_slope Abnormal 44.9 14.5
ortho_df2 %>% group_by(class_2) %>%
summarise("Mean of displacement" = mean(degree_spondylolisthesis), "SD of displacement" = sd(degree_spondylolisthesis))
## # A tibble: 2 × 3
## class_2 `Mean of displacement` `SD of displacement`
## <fct> <dbl> <dbl>
## 1 Normal 2.19 6.28
## 2 Abnormal 37.8 40.6
ortho_df2 %>% ggplot(aes(x =class_2, y= degree_spondylolisthesis, color = class_2)) +
geom_boxplot() +
stat_summary(fun.y = mean, geom = "point", shape = 18, size = 5)
## Warning: `fun.y` is deprecated. Use `fun` instead.
ortho_df2 %>% ggplot(aes(y= angles, x = class_2, color = type_of_measure)) +
geom_boxplot() +
stat_summary(fun.y = mean, geom = "point", shape = 18, size = 5)
## Warning: `fun.y` is deprecated. Use `fun` instead.
### En grupos por 3 classificaciones
ortho_df2 %>% group_by(type_of_measure, class_3) %>%
summarise("Mean of angle" = mean(angles), "Standart deviation" = sd(angles))
## `summarise()` has grouped output by 'type_of_measure'. You can override using the `.groups` argument.
## # A tibble: 15 × 4
## # Groups: type_of_measure [5]
## type_of_measure class_3 `Mean of angle` `Standart deviation`
## <chr> <fct> <dbl> <dbl>
## 1 lumbar_lordosis_angle Normal 43.5 12.4
## 2 lumbar_lordosis_angle Hernia 35.5 9.77
## 3 lumbar_lordosis_angle Spondylolisthesis 64.1 16.4
## 4 pelvic_incidence Normal 51.7 12.4
## 5 pelvic_incidence Hernia 47.6 10.7
## 6 pelvic_incidence Spondylolisthesis 71.5 15.1
## 7 pelvic_radius Normal 124. 9.01
## 8 pelvic_radius Hernia 116. 9.36
## 9 pelvic_radius Spondylolisthesis 115. 15.6
## 10 pelvic_tilt Normal 12.8 6.78
## 11 pelvic_tilt Hernia 17.4 7.02
## 12 pelvic_tilt Spondylolisthesis 20.7 11.5
## 13 sacral_slope Normal 38.9 9.62
## 14 sacral_slope Hernia 30.2 7.56
## 15 sacral_slope Spondylolisthesis 50.8 12.3
ortho_df2 %>% group_by(class_3) %>%
summarise("Mean of displacement" = mean(degree_spondylolisthesis), "SD of displacement" = sd(degree_spondylolisthesis))
## # A tibble: 3 × 3
## class_3 `Mean of displacement` `SD of displacement`
## <fct> <dbl> <dbl>
## 1 Normal 2.19 6.28
## 2 Hernia 2.48 5.49
## 3 Spondylolisthesis 51.9 40.0
ortho_df2 %>% ggplot(aes(x =class_3, y= degree_spondylolisthesis, color = class_3)) +
geom_boxplot() +
stat_summary(fun.y = mean, geom = "point", shape = 18, size = 5)
## Warning: `fun.y` is deprecated. Use `fun` instead.
ortho_df2 %>% ggplot(aes(y= angles,x =class_3,color = type_of_measure)) +
geom_boxplot() +
stat_summary(fun.y = mean, geom = "point", shape = 18, size = 5)
## Warning: `fun.y` is deprecated. Use `fun` instead.
## Normality tests
### Kolmogorov-Smirnov
ortho_df %>% select(where(is.numeric))%>% colnames() %>%
set_names() %>% map(~ lillie.test(ortho_df[,.])) %>%
map_dfr(., tidy, .id = "variable")
## # A tibble: 6 × 4
## variable statistic p.value method
## <chr> <dbl> <dbl> <chr>
## 1 pelvic_incidence 0.0708 7.33e- 4 Lilliefors (Kolmogorov-Smirnov) n…
## 2 pelvic_tilt 0.0829 2.37e- 5 Lilliefors (Kolmogorov-Smirnov) n…
## 3 lumbar_lordosis_angle 0.0687 1.25e- 3 Lilliefors (Kolmogorov-Smirnov) n…
## 4 sacral_slope 0.0578 1.43e- 2 Lilliefors (Kolmogorov-Smirnov) n…
## 5 pelvic_radius 0.0593 1.06e- 2 Lilliefors (Kolmogorov-Smirnov) n…
## 6 degree_spondylolisthesis 0.173 5.13e-25 Lilliefors (Kolmogorov-Smirnov) n…
### Shapiro
ortho_df %>% select(where(is.numeric))%>% colnames() %>%
set_names() %>% map(~ shapiro.test(ortho_df[,.x])) %>%
map_dfr(., tidy, .id = "variable")
## # A tibble: 6 × 4
## variable statistic p.value method
## <chr> <dbl> <dbl> <chr>
## 1 pelvic_incidence 0.971 7.13e- 6 Shapiro-Wilk normality test
## 2 pelvic_tilt 0.966 1.32e- 6 Shapiro-Wilk normality test
## 3 lumbar_lordosis_angle 0.972 9.22e- 6 Shapiro-Wilk normality test
## 4 sacral_slope 0.964 5.89e- 7 Shapiro-Wilk normality test
## 5 pelvic_radius 0.989 1.66e- 2 Shapiro-Wilk normality test
## 6 degree_spondylolisthesis 0.697 2.91e-23 Shapiro-Wilk normality test
### QQplot
ggqqplot(ortho_df2, "angles", facet.by = "class_3", color = "type_of_measure")
ggqqplot(ortho_df2, "angles", facet.by = "class_2", color = "type_of_measure")
ggqqplot(ortho_df2, "degree_spondylolisthesis", color = "class_3", facet.by = "class_2")
### Homogenidad
ortho_df %>% select(where(is.numeric))%>% colnames() %>%
set_names() %>% map(~ fligner.test(ortho_df[,.] ~ class_2, data = ortho_df)) %>%
map_dfr(., tidy, .id = "variable")
## # A tibble: 6 × 5
## variable statistic p.value parameter method
## <chr> <dbl> <dbl> <dbl> <chr>
## 1 pelvic_incidence 18.9 1.40e- 5 1 Fligner-Killeen test of…
## 2 pelvic_tilt 14.0 1.80e- 4 1 Fligner-Killeen test of…
## 3 lumbar_lordosis_angle 25.3 4.98e- 7 1 Fligner-Killeen test of…
## 4 sacral_slope 16.4 5.11e- 5 1 Fligner-Killeen test of…
## 5 pelvic_radius 9.29 2.30e- 3 1 Fligner-Killeen test of…
## 6 degree_spondylolisthesis 89.8 2.58e-21 1 Fligner-Killeen test of…
Tras realizar varios tests de normalidad se confirma que la distribución de data NO es normal, asi que procedemos a realizar tests ANOVA, con la idéa en mente de que la distribución puede ser no suficientemente normal para conseguir resultados fiables. El test de homogenidad de data sugiere NO-homogenidad de data.
anova_PI <- aov(pelvic_incidence~class_3, ortho_df)
anova_S <- aov(degree_spondylolisthesis~class_3, ortho_df)
anova_PR <- aov(pelvic_radius~class_3, ortho_df)
anova_LLA <- aov(lumbar_lordosis_angle~class_3, ortho_df)
par(mfrow=c(2,2))
plot(anova_PI)
par(mfrow=c(1,1))
plot(TukeyHSD(anova_PI))
par(mfrow=c(2,2))
plot(anova_S)
par(mfrow=c(1,1))
plot(TukeyHSD(anova_S))
par(mfrow=c(2,2))
plot(anova_PR)
par(mfrow=c(1,1))
plot(TukeyHSD(anova_PR))
par(mfrow=c(2,2))
plot(anova_LLA)
plot(TukeyHSD(anova_LLA))
par(mfrow=c(1,1))
ortho_df %>% ggplot(aes(lumbar_lordosis_angle, pelvic_incidence, color = class_3)) +
geom_point()
ortho_df %>% ggplot(aes(lumbar_lordosis_angle, pelvic_incidence, color = class_2)) +
geom_point()
fviz_nbclust(ortho_df[,c(1,3)], kmeans, method = "wss")
fviz_nbclust(ortho_df[,c(1,3)], kmeans, method = "silhouette")
cluster2 <- kmeans(ortho_df[, c(1,3)], 2, nstart = 25)
table(cluster2$cluster, ortho_df$class_2)
##
## Normal Abnormal
## 1 16 116
## 2 84 94
fviz_cluster(cluster2, data = ortho_df[, c(1,3)])
cluster3 <- kmeans(ortho_df[, c(1,3)], 3, nstart = 25)
table(cluster3$cluster, ortho_df$class_3)
##
## Normal Hernia Spondylolisthesis
## 1 38 12 67
## 2 58 48 13
## 3 4 0 70
fviz_cluster(cluster3, data = ortho_df[, c(1,3)])
cluster <- hclust(dist(ortho_df), method="complete")
## Warning in dist(ortho_df): NAs introduced by coercion
plot(cluster)
pltree(agnes(ortho_df, method = "complete"))